#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef long long LL;
typedef vector<char> vi;
int D,H;
map<vi, LL > M;
set<LL> S;
set<vi> _in;
struct node {
    vi vec;
    int cnt;
    node(vi a, int b) {vec=a; cnt=b; }
    node() {}
};
void BFS() {
    vi t;
    for (int i=0; i<D; ++i) t.push_back(0);
    M[t] = 1;
    queue<node> q;
    q.push(node(t, 0));
    _in.insert(t);
    while (!q.empty()) {
        node pre = q.front(); q.pop();
        t = pre.vec;
        _in.erase(t);
//        for (int i=0; i<D; ++i) printf("%d ", t[i]);
//        printf("\n");
//        printf("value: %d\n", M[t]);
        int cnt = pre.cnt;
        if (cnt==H-1) {
            S.insert(M[t]);
            continue;
        }
        for (int i=0; i<D; ++i) {
            if (i<D-1 && t[i]+1>t[i+1]) continue;
            t[i] += 1;
            if (!M.count(t)) M[t] = 0;
            LL cc = 0;
            for (int j=0; j<D; ++j) {
                if (t[j] == t[i]) {
                    ++cc;
                }
            }
            M[t] += cc * M[pre.vec];
//        for (int i=0; i<D; ++i) printf("%d ", t[i]);
//        printf("\n");
            if(!_in.count(t)){
                _in.insert(t);
                q.push(node(t, cnt+1));
            }
            t[i] -= 1;
        }
    }
}


int main() {
#ifdef hai
    freopen("in.txt", "r", stdin);
#endif
    while (cin>>D>>H) {
        M.clear();
        S.clear();
        BFS();
        for (set<LL>::iterator it=S.begin(); it!=S.end(); ++it) {
            printf("%lld\n", *it);
        }
    }
    return 0;
}
